/*闭包的简单例子*/
/*function A() {
 var B = function () {
 console.log('hello closure');
 }
 return B;
 }
 var C = A();
 C();*/
// (1)定义了一个普通函数A
// (2)在A中定义了普通函数B
// (3)在A中返回B（确切的讲，在A中返回B的引用）
// (4)执行A(),把A的返回结果赋值给变量 c
// (5)执行 c()
/**
 函数A的内部函数B被函数A外的一个变量 c 引用
 把这句扯淡的话再加工一下就变成了闭包的定义：
 当一个内部函数被其外部函数之外的变量引用时，就形成了一个闭包。
 */
/** javascript中的GC机制:在javascript中，如果一个对象不再被引用，那么这个对象就会被GC回收，否则这个对象一直会保存在内存中。
 在上述例子中，B定义在A中，因此B依赖于A,而外部变量 c 又引用了B, 所以A间接的被 c 引用，也就是说，A不会被GC回收，会一直保存在内存中*/
/*demo*/
function A1() {
    var count = 0;
    var B1 = function () {
        count++;
        console.log(count);
    }
    return B1;
}
var C1 = A1();
C1();
C1();
C1();
/*count是A中的一个变量，它的值在B中被改变，函数B每执行一次，count的值就在原来的基础上累加1。因此，A中的count一直保存在内存中。
 这就是闭包的作用;
 有时候我们需要一个模块中定义这样一个变量：
 希望这个变量一直保存在内存中但又不会“污染”全局的变量，这个时候，我们就可以用闭包来定义这个模块。
 */
(function (document) {
    var viewport;
    var obj = {
        init: function (id) {
            viewport = document.querySelector('#' + id);
        },
        addChild: function (child) {
            viewport.appendChild(child);
        },
        removeChild: function (child) {
            viewport.removeChild(child);
        }
    }
    window.jView = obj;
})(document);
console.log(jView);
